package Test;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

import Componentes.GeneradorPiezas;
import Componentes.Input;
import Componentes.Maquina;
import Componentes.Output;
import Componentes.Pieza;
import Componentes.Robot;


//En esta clase se prueba el camino 1.
public class testcamino1 {
	
	private Maquina m1;		
	private Maquina m2;
	private Robot r1;
	private Robot r2; 
	private Robot r3; 
	private Input i1;
	private Pieza pieza1;
	private Output o1;
	
	@Before
	public void setUp() throws Exception {
		i1 = new Input(1);
		Thread generadorinput1 = new Thread (new GeneradorPiezas(i1));
		generadorinput1.start();
		
		
		m1 = new Maquina(1);	
		m2 = new Maquina(2);
		r1 = new Robot(1);
		r2 = new Robot(2);
		r3 = new Robot(3);
		o1 = new Output(1);
		
		//Tiempo para generar piezas en input
		Thread.sleep(200);
		
		pieza1 = r1.Moverpieza(i1, m1, 100);
		m1.procesarPieza(pieza1, 1);
	}
	
	@Test
	public void testcantpiezasTerminadas() {
		//Testeo que luego de enviar una pieza para procesar a m1 desde el input 1, en la misma aya una pieza terminada.
		
		//Tiempo para que se procese la pieza;
		try {
			Thread.sleep(200);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		int cantterminadas = m1.cantTerminadas();
		assertEquals("Test cantidad piezas terminadas",1,cantterminadas);
	}
	
	
	@Test
	public void testMoverdem1am2() {
		/** Testeo que luego de procesar la pieza en m1, muevo la misma a m2 con r2 para que la procese,
		 * y chequeo la cantTerminadas en m1 y m2. */
		r2.Moverpieza(pieza1 , m1, m2, 1);	
		m2.procesarPieza(pieza1, 1);
		
		//Tiempo para que se procese la pieza;
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		
		int cantterminadas1 = m1.cantTerminadas();
		int cantterminadas2 = m2.cantTerminadas();
		
		assertEquals("Test cantidad piezas terminadas en m1", 0, cantterminadas1);
		assertEquals("Test cantidad piezas terminadas en m2", 1, cantterminadas2);
	}
	
	@Test
	public void testMoveraOutput(){
		/** Testeo que luego de procesar la pieza en m1 y m2, muevo la misma de m2 con r3 a o1,
		 * y chequeo la cantTerminadas en m1 y m2 y cantPiezas en o1. */
		
		r2.Moverpieza(pieza1 , m1, m2, 1);		
		m2.procesarPieza(pieza1, 1);
		
		//Tiempo para que se procese la pieza;
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		
		r3.Moverpieza(pieza1, m2, o1, 200);	
		
		int cantterminadas1 = m1.cantTerminadas();
		int cantterminadas2 = m2.cantTerminadas();
		assertEquals("Test cantidad piezas terminadas en m1", 0, cantterminadas1);
		assertEquals("Test cantidad piezas terminadas en m2", 0, cantterminadas2);
		int cantterminadaso1 = o1.cantPiezas();
		assertEquals("Test cantidad piezas terminadas en o1", 1, cantterminadaso1);	
	}
	

}
